<?php 
/**
 * Класс для работы с базой данных с библиотекой PDO
 * @author Бикмуллин Иван Олегович
 * @version 1.0
 */
class PDOdb extends PDO
{
	
    /**
     * get_messages
     * Функция получения сообщений из базы
     *
     */
	function get_messages()
	{
		try
		{
		    //выполняем запрос к базе
            $result = $this->query("SELECT * FROM messages ORDER BY actual_date DESC");
            //возвращаем ассоциативный массив 
			return $result->fetchAll();
		}
		catch (PDOException $e)
		{
			die("Error: ".$e->getMessage());
		}
	}
	/**
	 * get_comments
	 * функция получения комментариев
	 * @param int $id идентификатор сообщения, комментарии которого нужно получить
	 *
	 */
	function get_comments($id)
	{
		try
		{
			//Подготовка запроса
			$query = $this->prepare("SELECT * FROM comments where message_id=:id ORDER BY comment_date");
			//присваиваем параметрам полученные переменные
			$query->bindParam(':id',$id);
			//выполняем запрос
			$query->execute();
			//если комменты есть, 
			if($comments = $query->fetchAll())
			{
			    //возвращаем ассоциативный массив
			    return $comments;
			}
		}
		catch (PDOException $e)
		{
			die("Error: ".$e->getMessage());
		}
	}
	/**
	 * get_message
	 * Функция для получения сообщения
	 * @param string $tbl_name имя хранилища, из которого нужно достать сообщение
	 * @param int $id уникальный идентификатор сообщения или комментария
	 * @return array сообщение в виде массива
	 */
	function get_message($tbl_name, $id)
	{
	    try
	    {
	        //подготавливаем запрос 
	        $query = $this->prepare("SELECT * FROM ".$tbl_name." WHERE id=:id");
	        //присваеваем параметрам значения переменных
	        $query->bindParam(":id", $id);
	        //выполняем запрос
	        $query->execute();
	        //возвращаем ассоциативный массив
	        return $query->fetch(); 
	    }
	    catch (PDOException $e)
	    {
	        die("Error: ".$e->getMessage());
	    }
	}
	/**
	 * edit
	 * функция редактирования сообщения или коммента
	 * @param string $tbl_name имя таблицы, из которой нужно выбрать пост
	 * @param int $id идентификатор сообщения или комментария
	 * @param string $text текст сообщения
	 *
	 */
	function edit($tbl_name, $id, $text)
	{
	    try 
	    {
	        //обеспечиваем безопасность строки
	        $text = addslashes($text);
	        //подготавливаем запрос
	        $query = $this->prepare("UPDATE ".$tbl_name." SET text=:text WHERE id=:id");
	        //устанавливаем параметры
	        $query->bindParam(":text",$text);
	        $query->bindParam(":id", $id);
	        //исполняем и возвращаемся 
	        $query->execute();
	        return true;
	    }
	    catch (PDOException $e)
	    {
	        die("Error: ".$e->getMessage());
	    }
	}
	/**
	 * add_message
	 * Функция, обрабатывающая добавление сообщения в базу данных
	 * @param string $text текст сообщения
	 */
	function add_message($text)
	{
	    try 
	    {
	        //момент вызова функции
	        $date = date("Y-m-d H-i-s");
	        //обеспечиваем безопасность строки
	        $text = addslashes($text);
	        //подготовка запроса
	        $query = $this->prepare("INSERT INTO guestbook.messages (id,text,message_date,actual_date)
	                    VALUES (NULL,:text,:date,:date)");
	        //устанавливаем параметры
	        $query->bindParam(":text", $text);
	        $query->bindParam(":date", $date);
	        //исполняем и возвращаемся
	        $query->execute();
	        return true;
	    }
	    catch (PDOException $e)
	    {
	        die("Error: ".$e->getMessage());
	    }
	}
	/**
	 * delete
	 * Функция, обрабатывающая удаление записи из базы данных
	 * @param string $tbl_name имя таблицы из которой следует удалить запись
	 * @param int $id идентификатор сообщения или комментария который следует удалить
	 */
	function delete($tbl_name, $id)
	{
	    try
	    {
	        //выбор действий в зависимости от таблицы из которой следует удалять
	        switch($tbl_name)
	        {
	    	    //В случае удаления сообщения, так же следует удалить и все комментарии к нему
	    	    case "messages":
	    		    //формаирование текста запроса на удаление сообщения
	    		    $query = $this->prepare("DELETE FROM messages WHERE id = :id");
	    		    //выполнение запроса
	    		    $query->bindParam(":id", $id);
	    		    $query->execute();
	    		    //формирование текста запроса на удаление всех комментариев к данному сообщению
	    		    $query = $this->prepare("DELETE FROM comments WHERE message_id=:id");
	    		    //выполнение запроса
	    		    $query->bindParam(":id", $id);
	    	    break;
	    		//В случае удаления комментария, удаляем только сам комментарий
	    	    case "comments":
	    		    //формирование текста запроса на удаление комментария
	    		    $query = $this->prepare("DELETE FROM comments WHERE id=:id");
	    		    $query->bindParam(":id",$id);
	    		    //выполнение запроса
	    		    $query->execute();
	    	    break;
	        }
	    }
	    catch (PDOException $e)
	    {
	        die("Error: ".$e->getMessage());
	    }
	}
	/**
	 * add_comment
	 * Функция, обрабатывающая добавления комментария к сообщению
	 * @param string $text текст комментария
	 * @param int $id идентификатор комментируемого сообщения
	 */
	function add_comment($text, $id)
	{
	    try
        {
            //получение даты и времени момента вызова функции
            $date = date("Y-m-d H-i-s");
            //безопасность строки
            $text = addslashes($text);
        	//подготовка запроса 
            $query = $this->prepare("INSERT INTO `guestbook`.`comments`(`message_id`,
                                                                              `id`,
                                                                            `text`,
                                                                    `comment_date`)
                                                                       VALUES (:id,
                                                                              NULL,
                                                                             :text,
                                                                             :date)");
            //присваиваем параметрам полученные переменные
            $query->bindParam(':id',$id);
            $query->bindParam(':text',$text);
            $query->bindParam(':date',$date);
            //выполняем запрос
            $query->execute();
            //подготовка запроса на обновление актуальной даты сообщения
            $query = $this->prepare("UPDATE messages SET actual_date=:date WHERE id=:id");
            //присваиваем параметрам полученные переменные
            $query->bindParam(':date',$date);
            $query->bindParam(':id',$id);
            //выполняем запрос
            $query->execute();
	    }
	    catch(PDOException $e)
	    {
	        die("Error: ".$e->getMessage());
	    }
    }
}
?>